
from file_tools import read_file
from db_manager import *
from datetime import datetime


def send(user):
    """发送消息"""
    while True:
        # 发送消息前先打印所有的用户名
        print(f'序号\t用户名')
        all_user = db_select('select username from tb_users')
        for index, item in enumerate(all_user):
            logo = '(我)' if item[0] == user else ''
            print(f'{index + 1}\t{item[0]}{logo}')
        # 输入用户名进行判断
        who = input('发送给谁(请输入用户名)：').strip()
        if len(who) > 10 or who == '':
            print('输入错误！请重新输入！')
            continue
        elif user == who:
            print('不能发送给自己！！！请重新输入！')
            continue
        elif db_select(
                'select username from tb_users where username=%s',
                (who,)
        ):
            break
        else:
            print('该用户不存在！请重新输入！')
            continue
    while True:
        # 输入标题
        title = input('请输入标题(30字以内)：').strip()
        if len(title) > 30 or title == '':
            print('输入错误！请重新输入！')
            continue
        break
    while True:
        # 输入内容
        msg = input('请输入内容(300字以内)：')
        if len(msg) > 300 or msg == '':
            print('输入错误！请重新输入！')
            continue
        break
    # 将发送的消息放入数据库
    db_insert(
        'insert into tb_message (sender, accepter, title, content, sendtime, source)'
        ' values (%s, %s, %s, %s, %s, %s)',
        (user, who, title, msg, datetime.now(), user)
    )
    print('发送成功')
    return


def see(user, id_list: list):
    """查看消息"""
    # 判断用户输入是否正确
    while True:
        print('消息id列表：', id_list)
        value = input('请选择要查看的消息id：').strip()
        if int(value) not in id_list:
            print('请输入正确的消息id！！！')
            continue
        break
    # 查询用户选择的消息的内容
    msg = db_select(
        'select title, content, sender from tb_message where accepter=%s and msgid=%s and del=0 and see=0',
        (user, value)
    )
    # 显示内容
    for item in msg:
        print(f'来自{item[2]}的消息'.center(30, '+'))
        print(f'标题：{item[0]}')
        print(f'内容：{item[1]}')
        print(''.center(35, '-'))
    # 更改数据库see属性变为已读
    db_update(
        'update tb_message set see=1 where msgid=%s',
        (value,)
    )
    # 输入任意键退出查看
    back = input('输入任意键退出查看：')
    if back:
        return


def sign(user, id_list: list):
    """标记已读"""
    # 判断用户输入是否正确
    while True:
        print('消息id列表：', id_list)
        value = input('请选择要标记的消息id：').strip()
        if int(value) not in id_list:
            print('请输入正确的消息id！！！')
            continue
        break
    # 更新数据库
    db_update(
        'update tb_message set see=1 where accepter=%s and msgid=%s',
        (user, value)
    )
    print('标记成功！！！')
    return


def unread(user):
    """查看未读消息"""
    msgs = db_select(
        'select see, msgid, title, sendtime, sender from tb_message where accepter=%s and see=0 and del=0',
        (user,)
    )
    # 如果没有消息直接返回
    length = 0 if msgs is False else len(msgs)
    if length == 0:
        print('你还没有收到任何消息！！！')
        return
    # 显示所有未读消息
    print('未读消息(%s)'.center(40, '*') % length)
    print(f'{"状态":<3}{"id":<4}{"标题":<6}{"发送时间":<17}{"发送者":<3}')
    # 保存消息id的列表
    id_list = []
    for item in msgs:
        logo = '未读' if item[0] == 0 else '已读'
        id_list.append(item[1])
        print(f'{logo}\t{item[1]}\t{item[2]}\t{item[3]}\t{item[4]}')
    print()
    # 用户选择操作
    while True:
        # 显示操作界面
        print(read_file('./files/unread.txt'))
        value = input('请选择(1~3)：').strip()
        if value == '1':
            # 读取消息
            see(user, id_list)
        elif value == '2':
            # 标记已读
            sign(user, id_list)
        elif value == '3':
            # 返回上级
            return
        else:
            print('输入错误！请重新输入！')
            continue


def read_msg(user, id_list: list):
    """读取消息"""
    # 判断用户输入是否正确
    while True:
        print('消息id列表：', id_list)
        value = input('请选择要查看的消息id：').strip()
        if int(value) not in id_list:
            print('请输入正确的消息id！！！')
            continue
        break
    # 查询用户选择的消息的内容
    msg = db_select(
        'select title, content, sender from tb_message where accepter=%s and msgid=%s and del=0',
        (user, value)
    )
    # 显示内容
    for item in msg:
        print(f'来自{item[2]}的消息'.center(30, '+'))
        print(f'标题：{item[0]}')
        print(f'内容：{item[1]}')
        print(''.center(35, '-'))
    # 更改数据库see属性变为已读
    db_update(
        'update tb_message set see=1 where msgid=%s',
        (value,)
    )
    # 输入任意键退出查看
    back = input('输入任意键退出查看：')
    if back:
        return


def del_msg(user, id_list: list):
    """删除消息"""
    # 判断用户输入是否正确
    while True:
        print('消息id列表：', id_list)
        value = input('请选择要删除的消息id：').strip()
        if int(value) not in id_list:
            print('请输入正确的消息id！！！')
            continue
        break
    # 删除消息-更新数据库del字段
    db_update(
        'update tb_message set del=1 where accepter=%s and msgid=%s',
        (user, value)
    )
    print('删除成功！！！')
    return


def see_all(user):
    """查看所有的消息"""
    msgs = db_select(
        'select see, msgid, title, sendtime, sender from tb_message where accepter=%s and del=0',
        (user,)
    )
    # 如果没有消息直接返回
    length = 0 if msgs is False else len(msgs)
    if length == 0:
        print('你还没有收到任何消息！！！')
        return
    # 显示所有的消息
    print('所有消息(%s)'.center(40, '*') % len(msgs))
    print(f'{"状态":<3}{"id":<4}{"标题":<6}{"发送时间":<17}{"发送者":<3}')
    # 保存消息id的列表
    id_list = []
    for item in msgs:
        logo = '未读' if item[0] == 0 else '已读'
        id_list.append(item[1])
        print(f'{logo}\t{item[1]}\t{item[2]}\t{item[3]}\t{item[4]}')
    print()
    # 用户选择操作
    while True:
        # 显示操作界面
        print(read_file('./files/seeall.txt'))
        value = input('请选择(1~3)：').strip()
        if value == '1':
            # 读取消息
            read_msg(user, id_list)
        elif value == '2':
            # 删除消息
            del_msg(user, id_list)
        elif value == '3':
            # 返回上级
            return
        else:
            print('输入错误！请重新输入！')
            continue


def del_all(user):
    """删除所有消息"""
    msg = db_select(
        'select see, count(see) from tb_message where accepter=%s and del=0 group by see',
        (user, )
    )
    # 如果没有消息直接返回
    length = 0 if msg is False else len(msg)
    if length == 0:
        print('你还没有收到任何消息！！！无法删除')
        return
    # 显示用户消息的数量
    c_unread, c_read = 0, 0
    for item in msg:
        if item[0] == 0:
            c_unread = item[1]
        else:
            c_read = item[1]
    # 二次提醒用户
    ensure = input(f'你有{c_unread}条未读消息,{c_read}条已读消息,是否删除?(y/n)：').strip()
    if ensure == 'Y' or ensure == 'y':
        db_update(
            'update tb_message set del=1 where accepter=%s',
            (user,)
        )
    return


def chat(user):
    """登录成功后的聊天系统界面"""
    while True:
        # 打印主界面
        print(read_file('./files/login.txt') % user)
        value = input('请选择(1~5)：').strip()
        if value == '1':
            # 发送消息
            send(user)
        elif value == '2':
            # 查看未读消息
            unread(user)
        elif value == '3':
            # 查看所有消息
            see_all(user)
        elif value == '4':
            # 清除所有消息
            del_all(user)
        elif value == '5':
            # 注销登录，返回首页
            return home_page()
        else:
            print('输入错误！请重新输入！')
            continue


def login():
    """登录功能"""
    name = input('请输入用户名：').strip()
    pwd = input('请输入密码：').strip()
    # 判断用户名和密码是否一致
    if db_select(
            'select username, passwd from tb_users where username=%s and passwd=%s',
            (name, pwd)
    ):
        print('登录成功！')
        # 修改最后登录的时间
        db_update(
            'update tb_users set lasttime=%s where username=%s',
            (datetime.now(), name)
        )
        return chat(name)
    else:
        print('用户名或密码错误！')
        return


def register():
    """注册功能"""
    # 打印注册页面
    print(read_file('./files/register.txt'))
    value = input('请选择(1~2)：')
    if value == '1':
        # 填写信息注册
        while True:
            name = input('请输入用户名(1~10位)：').strip()
            # 验证用户名有效性
            if len(name) > 10 or len(name) == 0:
                print('输入错误！请重新输入！')
                continue
            # 验证用户名是否重复
            elif db_select(
                    'select username from tb_users where username=%s',
                    (name,)
            ):
                print('用户名已存在！请重新输入！')
                continue
            break
        while True:
            pwd = input('请输入密码(1~15位)：').strip()
            # 验证密码有效性
            if len(pwd) > 15 or len(pwd) == 0:
                print('输入错误！请重新输入！')
                continue
            break
        # 将用户名、密码和首次注册时间写入数据库
        db_insert(
            'insert into tb_users (username, passwd, lasttime) values (%s, %s, %s)',
            (name, pwd, datetime.now())
        )
        # 注册成功返回首页
        return
    elif value == '2':
        # 返回上一级
        return
    else:
        print('输入错误！请重新输入！')
        return register()


def home_page():
    """私聊系统首页"""
    while True:
        # 打印首页
        print(read_file('./files/menu.txt'))
        value = input('请选择(1-3)：').strip()
        if value == '1':
            # 登录功能
            login()
        elif value == '2':
            # 注册功能
            register()
        elif value == '3':
            # 退出功能
            exit('bye~bye~')
        else:
            print('输入错误！请重新输入！')
            continue


def main():
    """主函数"""
    home_page()


if __name__ == '__main__':
    main()
